package br.com.sgbl.dao;

import br.com.sgbl.bean.TipoEmbalagem;
import br.com.sgbl.utils.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Leandro
 */
public class TipoEmbalagemDao {

    private static final String SQL_LISTAR =
            "SELECT * FROM tipo_embalagem order by id";
    private static final String SQL_INSERIR =
            "INSERT INTO tipo_embalagem (id, descricao, quantidade) VALUES (?,?,?)";
    private static final String SQL_ALTERAR =
            "UPDATE tipo_embalagem SET  descricao = ?, quantidade = ? WHERE id = ?";
    private static final String SQL_EXCLUIR =
            "DELETE FROM tipo_embalagem WHERE id = ?";
    private static final String SQL_BUSCAR_POR_DESCRICAO_QUANTIDADE =
            "SELECT * FROM tipo_embalagem where descricao = ?";

    public TipoEmbalagem localizar(Connection conn, long codigo) throws SQLException {
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM tipo_embalagem where id= ?");
        ps.setLong(1, codigo);

        ResultSet rs = ps.executeQuery();

        if (rs.first()) {
            TipoEmbalagem tipoEmbalagem = new TipoEmbalagem();
            tipoEmbalagem.setId(rs.getLong("id"));
            tipoEmbalagem.setDescricao(rs.getString("descricao"));
            tipoEmbalagem.setQuantidade(rs.getInt("quantidade"));
            
            return tipoEmbalagem;
        } else {
            return null;
        }
    }
    
    public TipoEmbalagem salvar(TipoEmbalagem tipoEmbalagem) throws SQLException, Exception {
        if (tipoEmbalagem.getId() == 0) {
            return inserir(tipoEmbalagem);
        } else {
            return alterar(tipoEmbalagem);
        }
    }
    
    private Boolean validarTipoEmbalagem(Connection conn, TipoEmbalagem tipoEmbalagem) throws SQLException{
        PreparedStatement ps = conn.prepareStatement(SQL_BUSCAR_POR_DESCRICAO_QUANTIDADE);
        ps.setString(1, tipoEmbalagem.getDescricao());
        
        ResultSet rs = ps.executeQuery();
        
        return (rs.first());
    }
        

    private TipoEmbalagem inserir(TipoEmbalagem tipoEmbalagem) throws SQLException, Exception {
        Connection conn = Conexao.getConnection();
        
        if(validarTipoEmbalagem(conn, tipoEmbalagem)) {
            throw new Exception("Já existe um tipo de embalagem com a descrição: " + tipoEmbalagem.getDescricao() + ". Por favor insira uma nova descrição para o tipo de embalagem");
        }
        
        try {
            PreparedStatement ps = conn.prepareStatement(SQL_INSERIR,
                    PreparedStatement.RETURN_GENERATED_KEYS);

            ps.setNull(1, Types.NULL);
            ps.setString(2, tipoEmbalagem.getDescricao());
            ps.setInt(3, tipoEmbalagem.getQuantidade());
            
            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();
            rs.first();

            tipoEmbalagem.setId(rs.getLong("GENERATED_KEY"));

            conn.commit();
        } finally {
            conn.close();
        }

        return tipoEmbalagem;
    }

    private TipoEmbalagem alterar(TipoEmbalagem tipoEmbalagem) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_ALTERAR);

            ps.setString(1, tipoEmbalagem.getDescricao());
            ps.setDouble(2, tipoEmbalagem.getQuantidade());
            ps.setLong(3, tipoEmbalagem.getId());

            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }

        return tipoEmbalagem;
    }

    public List listar() throws SQLException {
        List lista = new ArrayList();

        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                TipoEmbalagem tipoEmbalagem = new TipoEmbalagem();

                tipoEmbalagem.setId(rs.getLong("id"));
                tipoEmbalagem.setDescricao(rs.getString("descricao"));
                tipoEmbalagem.setQuantidade(rs.getInt("quantidade"));
               
                lista.add(tipoEmbalagem);
            }
        } finally {
            conn.close();
        }

        return lista;
    }
     public void excluir(TipoEmbalagem tipoEmbalagem) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_EXCLUIR);

            ps.setLong(1, tipoEmbalagem.getId());

            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }
    }


}
